///\file depmodel.hh
///\author Allan BLANCHARD
///\brief Définit les modèles interdépendants
#ifndef _DEPMODEL
#define _DEPMODEL

#include "model.hh"
#include "transformation.hpp"

#include <vector>

///\class DepModel
///\brief Cette classe présente les spécificités de modèles dépendant d'un autre
///modèles, cela permet d'appliquer à un modèle, les mêmes déplacements que ceux
///du modèle du quel il dépend pour se placer relativement à celui-ci
class DepModel : public Model{
private :
  const DepModel *father; ///< Objet dont on dépend (0 si aucun)
  std::vector<Transformation*>transformations;

public :
  ///\brief Constructeur
  ///construit un modèle à partir d'un nom de fichier
  ///\param name nom du fichier
  ///\param transparent activer ou non la transparence
  DepModel(const char* name, bool transparent = false);

  ///\brief surcharge le dessin d'un modèle par l'application possible
  ///de déplacements avant le dessin.
  virtual void draw() const;
  
  ///\brief
  ///Applique d'abord les déplacements du père puis ceux du modèle lui même
  void applyTransformations() const;

  ///\brief
  ///Cette méthode permet d'ajouter une translation au modèle
  ///\warning l'ordre affecte votre rendu : les translations doivent
  ///être ajoutées dans leur ordre d'application.
  ///\param t translation à ajouter
  inline void addTranslation(Translation &t){ transformations.push_back(&t); }
  
  ///\brief
  ///Cette méthode permet d'ajouter une rotation au modèle
  ///\warning l'ordre affecte votre rendu : les rotations doivent
  ///être ajoutées dans leur ordre d'application.
  ///\param r rotation à ajouter
  inline void addRotation   (Rotation    &r){ transformations.push_back(&r); }

  ///\brief
  ///instaure la relation de dépendance avec un modèle
  inline void dependOn(const DepModel& m){ father = &m; }
};

#endif
